package com.example.zcb.rxjavademo;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import com.example.zcb.rxjavademo.bean.WebSite;

import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

import rx.Observable;
import rx.Scheduler;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Action;
import rx.functions.Action1;
import rx.functions.Func1;
import rx.schedulers.Schedulers;


public class MainActivity extends AppCompatActivity {
    private final String tag="RXJAVA";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //==========================简单入门篇==========================================
//        List<Course> courses1=new ArrayList<Course>();
//        courses1.add(new Course("语文"));
//        courses1.add(new Course("数学"));
//        courses1.add(new Course("英语"));
//        List<Course> courses2=new ArrayList<Course>();
//        courses2.add(new Course("语文1"));
//        courses2.add(new Course("数学1"));
//        courses2.add(new Course("英语1"));
//        List<Course> courses3=new ArrayList<Course>();
//        courses3.add(new Course("语文2"));
//        courses3.add(new Course("数学2"));
//        courses3.add(new Course("英语2"));
//        List<Course> courses4=new ArrayList<Course>();
//        courses4.add(new Course("语文3"));
//        courses4.add(new Course("数学3"));
//        courses4.add(new Course("英语3"));
//
//        Student[] students={new Student("张三",18,courses1),new Student("李四",20,courses2),new Student("王五",18,courses3),new Student("赵六",20,courses4)};
//        Subscriber<Course> subscriber=new Subscriber<Course>() {
//            @Override
//            public void onCompleted() {
//
//            }
//
//            @Override
//            public void onError(Throwable e) {
//
//            }
//
//            @Override
//            public void onNext(Course course) {
//                Log.d(tag,course.getCname());
//                //System.out.println("课程为:"+course.getCname());
//            }
//        };
//
//        rx.Observable.from(students)
//                .flatMap(new Func1<Student, rx.Observable<Course>>() {
//                    @Override
//                    public rx.Observable<Course> call(Student student) {
//                        return rx.Observable.from(student.getCourses());
//                    }
//                }).subscribe(subscriber);


        //===========================================================================================
        /**
         * 创建一个Observable对象很简单，直接调用Obserable.create()方法进行创建
         *
         */
        //===========================================================================================
        //创建Observable对象
        Observable<String> myObservable=Observable.create(
                new Observable.OnSubscribe<String>(){

                    @Override
                    public void call(Subscriber<? super String> subscriber) {
                        subscriber.onNext("Hello Word!");
                        subscriber.onCompleted();
                    }
                });
        //创建Subservable对象
        Subscriber<String> mySubscriber=new Subscriber<String>() {
            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onNext(String s) {
            System.out.println("下一个："+s);
            }
        };
        //关联关系，进行订阅
        myObservable.subscribe(mySubscriber);

        //<<<<<<<<<<<<<<<<<<<<<<<<下面是简化的订阅过程>>>>>>>>>>>>>>>>>>>>>>
        //简化Observable对象的创建过程
        Observable<String> observable=Observable.just("Hello Word");

        /**
         * 简化Subscriber:上面的例子中，我们其实并不关系OnComplete和OnError，我们只需要在OnNext的时候做一些处理
         * 这个时候可以使用Action1类
         */
        final Action1<String> onNextAction =new Action1<String>() {
            @Override
            public void call(String s) {
                System.out.println("简化Subscriber的创建过程:"+s);
            }
        } ;
        //下面进行订阅
        observable.subscribe(onNextAction);

        //上面的代码最终可以写成这样：
        Observable.just("Hello,World")
                .subscribe(new Action1<String>() {
                    @Override
                    public void call(String s) {
                        System.out.println("这个是最简化的订阅过程");
                    }
                });
        //使用JAVA8的lambda可以使代码更简洁:可能会不支持--->
//        Observable.just("Hello,Word")
//                .subscribe(s->System.out.println(s));

        /*=====================MAP操作符=====================================*/
        /**
         * 操作符是为了解决对Observable对象的变换的问题，操作符用于在Observable和最终的Subscriber之间
         * 修改Obserbable发出的事件。
         * MAP操作符可以把一个事件转化为另一个事件
         * 本实例中把String对象转换为integer对象
         *
         *Observable尽量多做事情
         * subscribe要尽量少做事情，因为它主要应用与更新UI
         *
         * 1.Observable和Subscriber可以做任何事情
         *Observable可以是一个数据库查询，Subscriber用来显示查询结果；Observable可以是屏幕上的点击事件，Subscriber用来响应点击事件；Observable可以是一个网络请求，Subscriber用来显示请求结果。
         *2. Observable和Subscriber是独立于中间的变换过程的。
         *在Observable和Subscriber中间可以增减任何数量的map。整个系统是高度可组合的，操作数据是一个很简单的过程。
         */
        /*==================================================================*/
        Observable.just("Hello,Word!")
                .map(new Func1<String, Integer>() {
                    @Override
                    public Integer call(String s) {
                        return s.hashCode();
                    }
                })
                .map(new Func1<Integer, String>() {
                    @Override
                    public String call(Integer i) {
                        return i.toString();
                    }
                })
                .subscribe(new Action1<String>() {
                    @Override
                    public void call(String i) {
                        System.out.println("MAP转化的结果为："+i);
                    }
                });

        //========================================================================
        /**
         * Observable.flatMap()接受一个Observable输出作为输入，同时输出另一个Observable.
         *
         * flatMap输出的Observable作为subscribe输入的Observable
         */
        //========================================================================
        List<String> list1=new ArrayList<String>();
        list1.add("www.baidu.com");
        list1.add("www.qq.com");
        list1.add("www.myweb.com");

        List<WebSite> webSites=new ArrayList<WebSite>();
        webSites.add(new WebSite("好123","www.hao123.com",list1));


        Observable.from(webSites)
                .flatMap(new Func1<WebSite, Observable<String>>() {
                    @Override
                    public Observable<String> call(WebSite webSite) {
                        return Observable.from(webSite.getList());
                    }
                })
                .subscribeOn(Schedulers.io())//生产的线程
                .observeOn(AndroidSchedulers.mainThread())//消费的线程
                .subscribe(new Action1<String>() {
                    @Override
                    public void call(String s) {

                        System.out.println("flatmap后的结果为:"+s);
                    }
                });




    }



















}
